package basic.kotlin.function
/**
 * 运算符：本质上就是一个函数
 * + 实际上对应的是kotlin的默认plus 方法
 * 我们可以自己定义plus的重载方法 写自己的运算符实现
 *
 */
//c1.plus(c2) 返回值 Complex
class Complex(var real: Double, var imaginary: Double){
   //  重载方法：1   参数Complex， 返回值 Complex
    operator fun plus(other: Complex): Complex{
        return Complex(real + other.real, imaginary + other.imaginary)
    }
    //  重载方法：2  参数Complex，返回值 Complex
    operator fun plus(other: Int): Complex{
        return Complex(real + other, imaginary)
    }

    //  重载方法：3 参数Any，返回值 Int
    operator fun plus(other: Any): Int {
        return (real + imaginary).toInt()
    }

    //  重载方法：4
    operator fun invoke(): Double{
        return Math.hypot(real, imaginary) // q取模运算
    }

    override fun toString(): String {
        return "结果：$real + ${imaginary}"
    }
}

//中缀符号表达式，用于两个对象间的运算
class Book{
     infix fun on(any: Any): Boolean{
        return false
    }
}

class Desk

fun main(args: Array<String>) {
//   + 实际上对应的是kotlin的默认plus 方法
    println(1 + 2)
    val c1 = Complex(3.0, 4.0)
    val c2 = Complex(2.0, 5.0)

    println(c1 + c2)      // 结果：5.0 + 9.0 第一个重载方法 等价于  println(c1.plus(c2))
    println(c1 + 5)       // 结果：8.0 + 4.0第二个重载方法 等价于 println(c1.plus(5))
    println(c1 + "haha")  // 7 第三个重载方法 等价于 println(c1.plus("haha"))
    println(c1())         // 5.0 第四个重载方法 等价于 println(c1.invoke())


    //字符串包含
    val arrayOfStr: Array<String> = arrayOf("my","name","is黑客")
    if("name" in arrayOfStr){  // 等价于  arrayOfStr.contains("name")
        println(arrayOfStr[arrayOfStr.indexOf("name") + 1])
    }

    if(Book() on Desk()){ // dsl
    }

}